package main

import (
	"JudgeSandBox/utils"
	"os"
	"os/exec"
	"syscall"
)

func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

func Init() {
	if exists, _ := PathExists("/root/judge"); exists {
		os.RemoveAll("/root/judge")
	}
	os.Mkdir("/root/judge", 0777)
	os.Mkdir("/root/judge/tmp", 0777)
}

func InitMount() {
	// systemd 加入linux之后, mount namespace 就变成 shared by default, 所以你必须显示声明你要这个新的mount namespace独立。
	err := syscall.Mount("", "/", "", syscall.MS_PRIVATE|syscall.MS_REC, "")
	if err != nil {
		utils.PrintToLog("mount / error")
	}

	/*//tmpfs 是一种基于内存的文件系统 ，可以使用 RAM 或 swap 分区来存储。
	  syscall.Mount("tmpfs", "/root/judge/tmp", "tmpfs", syscall.MS_NOSUID|syscall.MS_STRICTATIME, "mode=777")*/
}

func Exit() {
	if err := exec.Command("umount", "/root/judge/tmp").Run(); err != nil {
		utils.PrintToLog(err)
	}
}

func main() {
	if os.Args[0] == "/proc/self/exe" {
		if os.Args[1] == "start" {
			//InitMount()
			start()
			Exit()
		} else if os.Args[1] == "exec" {
			//创建工作空间
			if err := Exec(); err != nil {
				utils.PrintToLog(err)
			}
		} else if os.Args[1] == "call" {
			//真正执行测评
			//调用命令
			callArgs := os.Args[2:]
			Call(callArgs)
		}
	} else {
		Init()
		cmd := exec.Command("/proc/self/exe", "start")
		/*cmd.SysProcAttr = &syscall.SysProcAttr{
			Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWIPC,
		}*/
		if err := cmd.Run(); err != nil {
			utils.PrintToLog(err)
		}
	}
}
